package acm.pta13;

import java.util.*;

//此代码为他人代码并非提交，仅测试
public class 网络寻路_1452 {
    public static Vector<Vector<Integer>> vertexes = new Vector<>();
    public static int[] visited = new int[100001];
    public static int sum = 0;
    public static int start = 0;
    // 题目地址：https://www.dotcpp.com/oj/problem1452.html
    // 思路：深搜（DFS）、邻接表
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(), m = scanner.nextInt();
        // 初始化邻接表
        for (int i = 0; i < n; i++) {
            vertexes.add(new Vector<>());
        }
        // 邻接表的输入
        for (int i = 0; i < m; i++) {
            int from = scanner.nextInt();
            int to = scanner.nextInt();
            // 此处我们将输入的第一个点作为出发的点
            // 那么to就是from这个的目标点
            vertexes.get(from - 1).add(to - 1);
            // 此处我们将输入的第二个点作为出发的点
            // 那么from就是to这个的目标点
            vertexes.get(to - 1).add(from - 1);
        }
        int i = 0;
        for (Vector<Integer> node : vertexes) {
            // 先把起点标记上
            visited[i] = 1;
            // 记录开始的点，这里start是全局变量，所以在DFS里面也可以访问
            // 主要用来做到最后到终点的判断
            start = i;
            DFS(1, node);
            // 记得还原
            visited[i] = 0;
            // 因为for用了快速遍历，所以需要有一个i记录起点
            // 当然我们用传统for语句也可以
            i++;
        }
        System.out.println(sum);
    }
    // forwarnNum 用来记录走的地点数量、node用来记录下一个可以走的点的集合
    public static void DFS(int forwardNum, Vector<Integer> node) {
        // 如果 forwardNum == 那就说明此时走的就是最后到终点的那一步
        // 此时我么做一个特殊判断即可，不需要在做一次DFS了。
        if (forwardNum == 3) {
            for (int vertex : node) {
                // 此处有两种可能，走过的下一个点，从来没有被走过，自然可以走
                // 第二种：和起点一样，则也可以走。
                // 满足上述两种的话，就 sum++ 并退出
                if (visited[vertex] == 0 || vertex == start) {
                    sum++;
                    System.out.println("vertex = " + vertex);
                }
            }
            return;
        }
        // 能到这里，就说嘛不是最后的异步
        // 就把这点能走的其他点走一遍
        for (int vertex : node) {
            // 如果这个点之前已经被记录走过了，那就不走他
            if (visited[vertex] == 1) continue;
            // 能到这里就是可以走
            // 那就接着获取走了之后，能走的点
            Vector<Integer> next = vertexes.get(vertex);
            // 标记为已走过
            visited[vertex] = 1;
            DFS(forwardNum + 1, next);
            // 记得还原！
            visited[vertex] = 0;
        }
    }
}
